package cn.lcsjsxy.yxc.exception.finally的使用;

import org.junit.jupiter.api.Test;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

/*
 * try-catch-finally中finally的使用
 *
 * 1.finally是可选的
 * 2.finally中声明的是一定会被执行的代码，即使catch中又出现异常了，try中有return语句，catch中有return语句
 * 3.像数据库链接、输入输出流、网络编程Socket等资源，JVM是不能自动的回收的，我们需要自己手动的进行资源的释放。此时的资源释放，就需要声明再finally中
 * 4.try-catch-finally结构可以嵌套
 *
 * 体会2：开发中，由于运行时异常比较常见，所以我们通常就不针对运行时异常编写try-catch-finally了，针对于编译的异常，我们说一定要考虑异常的处理。
 * */
public class finallyTest {
    @Test
    public void test2(){
        FileInputStream fis=null;
        try {
            File file=new File("hello.txt");
            fis=new FileInputStream(file);
            int data=fis.read();
            while(data != -1){
                System.out.print((char)data);
                data=fis.read();
            }
            fis.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if(fis != null)
                    fis.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

    @Test
    public void test1() {
        try {
            int a = 10;
            int b = 0;
            System.out.println(a / b);
        } catch (ArithmeticException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("我好帅啊~~~");
        }

        System.out.println("我真帅");
    }

    public int method(){
        try {
            int[] arr = new int[10];
//            System.out.println(arr[10]);
        } catch (ArrayIndexOutOfBoundsException e) {
            e.printStackTrace();
            return 1;
        } finally {
            System.out.println("我一定会被执行");
        }
        return 0;
    }
}
